/*!
 * \file MQServer.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 消息队列服务器头文件
 * 
 * \details 本文件定义了WonderTrader消息队列系统的服务器类：
 *          - 基于UDP协议实现消息广播服务器
 *          - 支持多主题消息发布功能
 *          - 提供异步消息发送机制
 *          - 支持消息确认和可靠传输
 *          - 实现线程安全的消息队列管理
 *          - 提供高性能的消息广播能力
 */
#pragma once

#include <queue>

#include "../Includes/WTSMarcos.h"
#include "../Share/StdUtils.hpp"

NS_WTP_BEGIN
class MQManager;

/**
 * @brief 消息队列服务器类
 * @details 实现基于UDP的消息广播服务器，支持多主题消息发布和异步发送
 */
class MQServer
{
public:
	/**
	 * @brief 构造函数
	 * @details 初始化消息服务器实例
	 * @param mgr 消息队列管理器指针
	 */
	MQServer(MQManager* mgr);
	
	/**
	 * @brief 析构函数
	 * @details 清理服务器资源，关闭网络连接和线程
	 */
	~MQServer();

public:
	/**
	 * @brief 获取服务器ID
	 * @details 返回服务器的唯一标识ID
	 * @return uint32_t 服务器ID
	 */
	inline uint32_t id() const { return _id; }

	/**
	 * @brief 初始化服务器
	 * @details 根据URL初始化UDP服务器，创建套接字并绑定地址
	 * @param url 服务器URL地址（格式：udp://ip:port）
	 * @param confirm 是否启用消息确认机制
	 * @return bool 初始化是否成功
	 */
	bool	init(const char* url, bool confirm = false);

	/**
	 * @brief 发布消息
	 * @details 向指定主题发布消息，支持异步发送
	 * @param topic 消息主题
	 * @param data 消息数据指针
	 * @param dataLen 消息数据长度
	 */
	void	publish(const char* topic, const void* data, uint32_t dataLen);

private:
	std::string		_url;			/*!< 服务器URL地址 */
	bool			_ready;			/*!< 服务器就绪状态 */
	int				_sock;			/*!< UDP套接字句柄 */
	MQManager*		_mgr;			/*!< 消息队列管理器指针 */
	uint32_t		_id;			/*!< 服务器唯一ID */
	bool			_confirm;		/*!< 是否启用确认机制 */

	StdThreadPtr	m_thrdCast;		/*!< 消息广播线程 */
	StdCondVariable	m_condCast;		/*!< 条件变量，用于线程同步 */
	StdUniqueMutex	m_mtxCast;		/*!< 互斥锁，保护消息队列 */
	bool			m_bTerminated;	/*!< 线程终止标志 */

	/**
	 * @brief 发布数据结构体
	 * @details 用于存储待发布的消息数据
	 */
	typedef struct _PubData
	{
		std::string	_topic;		/*!< 消息主题 */
		std::string	_data;		/*!< 消息数据 */

		/**
		 * @brief 构造函数
		 * @details 初始化发布数据结构
		 * @param topic 消息主题
		 * @param data 消息数据指针
		 * @param dataLen 消息数据长度
		 */
		_PubData(const char* topic, const void* data, uint32_t dataLen)
			: _data((const char*)data, dataLen), _topic(topic)
		{
		}
	} PubData;
	typedef std::queue<PubData> PubDataQue;

	PubDataQue		m_dataQue;		/*!< 消息发送队列 */
	std::string		m_sendBuf;		/*!< 发送缓冲区 */
};

NS_WTP_END